package com.liu.audio.tts;

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

/**
 * https://help.aliyun.com/zh/model-studio/user-guide/text-to-speech
 * 百炼支持的语音合成模型包括CosyVoice和Sambert。
 *    CosyVoice支持流式输入+流式输出，以及非流式输入+流式/非流式输出。Sambert仅支持非流式输入+流式/非流式输出。
 * 如果您有以下特定需求，请选择Sambert。
 *    需要合成中英以外的语言（西班牙语、意大利语等）。
 *    需要通过SSML标记语言控制声音的断句、停顿、情绪、发音等。
 *    需要在输出音频流的同时，输出每个汉字/英文单词在音频中的时间戳，用于驱动虚拟人口型、制作视频配音字幕等。
 */
public class CosyVoice {
  private static String apikey = "sk-d1c41de66c074fc686488ab227d32fbe";
  private static String model = "cosyvoice-v1";
  private static String voice = "longxiaochun";

  public static void synthesizeAndSaveAudio() {
    SpeechSynthesisParam param =
        SpeechSynthesisParam.builder()
            // 若没有将API Key配置到环境变量中，需将下面这行代码注释放开，并将apiKey替换为自己的API Key
             .apiKey(apikey)
            .model(model)
            .voice(voice)
            .build();
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
    ByteBuffer audio = synthesizer.call("Paraformer语音识别服务只识别并转写音频中的语音内容，非语音内容不计费。" +
            "实际转写时长通常短于原始音频时长。由于采用AI判断，可能存在少许误差。");
    System.out.print("requestId: " + synthesizer.getLastRequestId());
    try (FileOutputStream fos = new FileOutputStream("D:\\output.wav")) {
      fos.write(audio.array());
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  public static void main(String[] args) {
    synthesizeAndSaveAudio();
    System.exit(0);
  }
}